﻿using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TouchSocket.Core;
using TouchSocket.Http;
using TouchSocket.Sockets;
using static System.Net.Mime.MediaTypeNames;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        HttpService serviceGN, serviceXN;
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.label1.Enabled = false;
                serviceGN = new HttpService();
                await serviceGN.SetupAsync(new TouchSocketConfig()//加载配置
                     .SetListenIPHosts(9912)//开放的端口    
                     .ConfigureContainer(a =>
                     {
                         a.AddConsoleLogger();
                     })
                     .ConfigurePlugins(a =>
                     {
                         //此处添加插件逻辑，插件可以使用PluginBase类实现IHttpPlugin接口完成。
                         //这里使用委托直接完成
                         a.Add(typeof(IHttpPlugin), new Func<HttpContextEventArgs, Task>(Oper));

                         //default插件应该最后添加，其作用是
                         //1、为找不到的路由返回404
                         //2、处理header为Option的探视跨域请求。
                         a.UseDefaultHttpServicePlugin();
                     }));
                await serviceGN.StartAsync();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
        class ResultModel
        {

            public string code { get; set; }
            public string msg { get; set; }
            public string data { get; set; }
            public string page { get; set; }

        }
        class testGN
        {
            public int id { get; set; }//id 是   int 任务单唯一id
            public string referenceID { get; set; }// 是   string 所属项目
            public string code { get; set; }//code 是   string 测试单编号
            public string title { get; set; }//title 是   string 产品名称
            public string enum01 { get; set; }//enum01 是   string 程序用途：单选，统招/批产/小批/电科院/预研
            public string enum02 { get; set; }//enum02  是 string 产品类别：单选，国内表计/海外表计/终端/模块/量测开关/其他
            public string text02 { get; set; }//text02  是 string 客户名称
            public string str01 { get; set; }//str01 是   string 产品型号+特征码
            public string str02 { get; set; }//str02   是 string 特征码 删除，合并到str01产品型号
            public string text03 { get; set; }//text03  是 string 其他适用表型
            public string enum03 { get; set; }//enum03 是   string 适用电流规格：多选， 1.5(6)A/5(10)A/10(60)A/1.5(12)A/5(40)A/20(80)A
            public string enum04 { get; set; }//enum04  是 string 适用电压规格：多选， 3*220V/380V;220V；3*57.5V/100V;
            public string str03 { get; set; }//str03 是   string 硬件版本号
            public string str06 { get; set; }//str06 是   string 内部软件版本号
            public string str04 { get; set; }//str04 是   string MCU型号
            public string str05 { get; set; }//str05 是   string 计量芯片型号
            public string str07 { get; set; }//str07 是   string 烧写码编号更改前（已下发）
            public string str21 { get; set; }//str21 是   string 烧写码编号更改前CRC码
            public string str08 { get; set; }//str08 是   string 烧写码编号更改后（内部）
            public string str09 { get; set; }//str09 是   string 烧写码编号更改后（外部）
            public string str22 { get; set; }//str22 是   string 烧写码编号更改后CRC码
            public string text04 { get; set; }//text04 是   string 设计<更改>原因
            public string text05 { get; set; }//text05  是   string 设计<更改>及测试内容
            public string enum05 { get; set; }//enum05  是   string 现场是否升级：是/否
            public string res01 { get; set; }//res01   是   string 软件负责人
            public string text01 { get; set; }//text01 否   string 同时升级的软件
            public string text10 { get; set; }//text10 是   string 在制品处理（入库已发出）
            public string text11 { get; set; }//text11 是   string 在制品处理（入库未发出）
            public string text12 { get; set; }//text12 是   string 在制品处理（流程中/在制品）
            public string date01 { get; set; }//date01 是   string 送测时间：推送任务单时生成
            public string date02 { get; set; }//date02      string 接收时间
            public string sys01 { get; set; }//sys01 是   string 委托单位
            public string enum06 { get; set; }//enum06 是   string 测试性质：研发新品/设计改进/入网样表/摸底测试/周期型式/委外测试/认证样表/省网统招/成品抽检/招标样表/小批试制
            public string enum09 { get; set; }//enum09  是   string 测试内容：全功能测试/更改项测试/可靠性测试 注：更改项测试必须填写测试具体内容（有一个附件）
            public string res02 { get; set; }//res02 是   string 送测人用户名（PMS系统用户名为员工号）
            public string text06 { get; set; }//text06 是   string 统招批次
            public string text07 { get; set; }//text07 是   string 通讯规约
            public string enum08 { get; set; }//enum08*   string 是否带交采：是/否
            public string text08 { get; set; }//text08	*	string 内核版本
            public string text09 { get; set; }//text09*   string 扩展模块型号
            public string date03 { get; set; }//date03      string 计划开始时间
            public string date04 { get; set; }//date04 string 计划完成时间
            public string num01 { get; set; }//num01       string 送测次数
            public string date05 { get; set; }//date05      string 测试开始时间
            public string date06 { get; set; }//date06      string 测试完成时间
            public string date07 { get; set; }//date07      string 报告发放时间
            public string enum07 { get; set; }//enum07      string 测试结果
                                              //public string referenceID { get; set; }//file 是   附件 附件

        }
        class testXN
        {
            public int id { get; set; }//id	是	int	任务单唯一id
            public string referenceID { get; set; }//referenceID 是   string 所属项目
            public string code { get; set; }//code 是   string 测试单编号
            public string title { get; set; }//title 是   string 产品名称
            public string sys01 { get; set; }//sys01 是   string 送测单位
            public string text01 { get; set; }//text01 是   string 客户信息
            public string num01 { get; set; }//num01 是   string 订单数量
            public string enum01 { get; set; }//enum01 是   string 测试性质：研发新品/设计改进/入网样表/摸底测试/周期型式/委外测试/认证样表/省网统招/成品抽检/招标样表/小批试制
            public string enum02 { get; set; }//enum02  是 string 测试内容：全功能测试/更改项测试/可靠性测试 注：所有内容必须填写测试具体内容（有一个附件），测试中心提供选择表
            public string res01 { get; set; }//res01   是 string 送测人
            public string date01 { get; set; }//date01 是   string 送测时间：推送任务单时生成
            public string text02 { get; set; }//text02  是 string 任务描述和要求
            public string text03 { get; set; }//text03 是   string 测试标准：单选
            public string text04 { get; set; }//text04  是 string 备注
            public string text05 { get; set; }//text05 是   string 产品型号
            public string str01 { get; set; }//str01 是   string 特征码
            public string num02 { get; set; }//num02 是   string 样品数量
            public string enum03 { get; set; }//enum03 是   string 电压规格：多选
            public string enum04 { get; set; }//enum04  是 string 电流规格：多选
            public string text06 { get; set; }//text06  是 string 脉冲常数
            public string enum05 { get; set; }//enum05 是   string 精度等级：多选
            public string text07 { get; set; }//text07  是 string 通讯规约
            public string text08 { get; set; }//text08* string 负荷开关
            public string text09 { get; set; }//text09* string 辅助电源
            public string text10 { get; set; }//text10 是   string 螺钉材料
            public string text11 { get; set; }//text11 是   string 芯片信息
            public string text12 { get; set; }//text12* string 内核版本
            public string enum06 { get; set; }//enum06* string 是否带交采：是/否
            public string text13 { get; set; }//text13      string 参数版本
            public string text14 { get; set; }//text14 是   string 计量方式
            public string text15 { get; set; }//text15 是   string 硬件版本
            public string text16 { get; set; }//text16 是   string 软件版本
            public string sublist01 { get; set; }//sublist01* 模块信息（子表）
            public string num03 { get; set; }//num03 string 送测次数
            public string date02 { get; set; }//date02 string 接收时间
            public string date03 { get; set; }//date03 string 计划开始时间
            public string date04 { get; set; }//date04 string 计划完成时间
            public string date05 { get; set; }//date05 string 测试开始时间
            public string date06 { get; set; }//date06 string 测试完成时间
            public string date07 { get; set; }//date07 string 报告发放时间
            public string enum07 { get; set; }//enum07 string 测试结果
            public string num04 { get; set; }//num04 string 测试轮次
            public string file { get; set; }//file 附件 附件
            public List<MeterModule> moduleList { get; set; }//模块列表

        }
        class MeterModule
        {
            public string str01 { get; set; }//str01* string 模块类型
            public string str02 { get; set; }//str02* string 厂家
            public string str03 { get; set; }//str03* string 型号
            public string str11 { get; set; }//str11* string 通信规约
            public string str12 { get; set; }//str12* string 硬件版本
            public string str13 { get; set; }//str13* string 软件版本
        }
        class CustUser
        {
            public string user { get; set; }
            public string pass { get; set; }
            public byte[] file { get; set; }
        }
        void kv2Instance(object obj, System.Collections.Generic.IDictionary<string, string> dictionary)
        {
            Type type = obj.GetType();
            foreach (var pair in dictionary)
            {
                PropertyInfo property = type.GetProperty(pair.Key);
                if (property != null && property.CanWrite)
                {
                    try
                    {
                        // 根据属性类型进行类型转换
                        if (property.PropertyType == typeof(int))
                        {
                            if (int.TryParse(pair.Value, out int intValue))
                            {
                                property.SetValue(obj, intValue);
                            }
                        }
                        else if (property.PropertyType == typeof(string))
                        {
                            property.SetValue(obj, pair.Value);
                        }
                        // 可以添加更多的类型转换逻辑，如 DateTime, bool 等
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Failed to assign value to property {pair.Key}: {ex.Message}");
                    }
                }
            }
        }
        async Task Oper(HttpContextEventArgs e)
        {
            var request = e.Context.Request;//http请求体
            var response = e.Context.Response;//http响应体
            var query = e.Context.Request.Query;
            //string bodyString = await e.Context.Request.GetBodyAsync();
            StringBuilder sb = new StringBuilder();
            sb.Append($"[{(request.Method)}] {request.URL}\r\n");
            // OperateControl.richAdd(rich当前, sb.ToString());
            await Console.Out.WriteLineAsync(sb.ToString());

            //显示访问路径，参数
            if (query != null)
            {
                sb.Clear();
                foreach (var item in query)
                {
                    sb.Append($"{item.Key} {item.Value}\r\n");
                    Console.WriteLine($"{item.Key} {item.Value}");
                }
                await Console.Out.WriteLineAsync(sb.ToString());
                string.Format("{0}...{1}", 1, 2);
                string x = $"{1}{2}";
            }
            //判断url
            if (request.IsGet())
            {
                if (request.UrlEquals("/LIMS/api/testTaskFunc"))///say                                                    
                {
                    //直接响应文字
                    await response
                         .SetStatus(200, "success")
                         .FromText("Success")
                         .AnswerAsync();//直接回应
                    Console.WriteLine("处理/GET success");
                    return;
                }
                if (request.UrlEquals("/LIMS/api/testTaskPerf"))//if (request.UrlEquals("/nms/login"))  性能测试单
                {
                    List<MeterModule> moduleList = new List<MeterModule>();
                    moduleList.Add(new MeterModule()
                    {
                        str01 = "str01",
                        str02 = "str02",
                        str03 = "str03",
                        str11 = "str11",
                        str12 = "str12",
                    });
                    testXN testXN = new testXN()
                    {
                        code = "12",
                        moduleList = moduleList
                    };
                    var rm = new ResultModel()
                    {
                        msg = "123",
                        code = "200",
                        //data = "12346",
                        data = JsonConvert.SerializeObject(testXN),
                    };
                    string test1 = JsonConvert.SerializeObject(rm);

                    await response
                            //.SetStatus(200, "success")
                            .FromJson(test1)
                            .AnswerAsync();//直接回应
                    Console.WriteLine("处理/success");
                    return;
                }
                if (request.UrlEquals("/js"))
                {
                    ;
                    ////直接响应文字
                    //await response
                    //    .SetStatus(200, "success")
                    //    .FromJson(JsonConvert.SerializeObject(new HttpRevToken(200, "ABCDEF", "success")))
                    //    .AnswerAsync();//直接回应
                    //Console.WriteLine("处理/success");
                    //return;
                }
            }
            if (request.IsPost())
            {
                try
                {
                    if (request.UrlEquals("/LIMS/api/testTaskFunc"))
                    {
                        var items = await e.Context.Request.GetFormCollectionAsync();
                        Dictionary<string, string> keys = new Dictionary<string, string>();
                        foreach (var item in items)
                        {
                            keys.Add(item.Key, item.Value);
                        }
                        CustUser cu = new CustUser();
                        kv2Instance(cu, keys);
                        var files = items.Files;
                        foreach (var item in files)
                        {
                            if (item is TouchSocket.Http.IFormFile iff)
                            {
                                string name = iff.Name;
                                string fn = iff.FileName;
                                byte[] file = iff.Data.ToArray();
                                if (name == "file")
                                {
                                    cu.file = file;
                                }
                            }
                        }

                        
                        return;
                    }
                    else if (request.UrlEquals("/LIMS/api/testTaskPerf"))//http://ip:port/LIMS/api/testTaskPerf 性能测试单
                    {
                        //var test2 = (testXN)JsonConvert.DeserializeObject<testXN>(bodyString);
                        //bool bLogin = false;
                        //string user = query["user_account"];
                        //string pass = query["password"];
                        //bLogin = (user == "admin" && pass == "admin888");
                        ////直接响应文字
                        //await response
                        //     .SetStatus(200, "success")
                        //     .FromText("Success")
                        //     .AnswerAsync();//直接回应
                        //Console.WriteLine("处理/success");
                        //return;
                    }
                }
                catch (Exception ex)
                {
                    //var rm = new ResultModel()
                    //{
                    //    msg = ex.Message,//"123",
                    //    code = "400",
                    //    data = bodyString//JsonConvert.SerializeObject(testXN),
                    //};
                    //string test1 = JsonConvert.SerializeObject(rm);
                    //await response
                    //        //.SetStatus(200, "success")
                    //        .FromJson(test1)
                    //        .AnswerAsync();//直接回应
                    //Console.WriteLine("接收数据处理异常" + bodyString == null ? "null" : bodyString);
                    //return;
                    ////直接响应文字
                    //await response
                    //     .SetStatus(200, ex.Message)
                    //     .FromText(ex.Message)
                    //     .AnswerAsync();//直接回应
                    //Console.WriteLine("处理失败/" + ex.Message);
                }
                //if (request.UrlEquals("/LIMS/api/testTaskFunc"))///say
                //{
                //     var test2= (test)JsonConvert.DeserializeObject<test>(bodyString);
                //    //直接响应文字
                //    await response
                //         .SetStatus(200, "success")
                //         .FromText("Success")
                //         .AnswerAsync();//直接回应
                //    Console.WriteLine("处理/success");
                //    return;
                //}
                if (request.UrlEquals("/json"))
                {
                    bool bLogin = false;
                    if (query != null)
                    {
                        sb.Clear();
                        foreach (var item in query)
                        {
                            sb.Append($"{item.Key} {item.Value}\r\n");
                            Console.WriteLine($"{item.Key} {item.Value}");
                            if (item.Key.ToLower() == "token")
                            {
                                bLogin = item.Value == "ABCDEF";
                            }
                        }
                        //OperateControl.richAdd(rich当前, sb.ToString());
                    }
                    //直接响应文字
                    //await response
                    //     .SetStatus(bLogin ? 200 : 401, bLogin ? "success" : "Fail")
                    //     .FromJson(JsonConvert.SerializeObject(new HttpRev(bLogin ? 200 : 401, bLogin ? "success" : "Fail")))
                    //     .AnswerAsync();//直接回应
                    //                    //Console.WriteLine("处理/json success");
                    //return;
                }
            }
            //如果上述url没有处理，则转到下一插件处理
            await e.InvokeNext();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private async void button2_Click(object sender, EventArgs e)
        {
            var client = new HttpClient();
            await client.ConnectAsync("http://172.16.6.211:9000");//先做连接
                                                                  //创建一个请求
            var request = new HttpRequest();
            request.InitHeaders()
                .SetUrl("pm/api/nologin/login/userToken?userToken=1c972f42e174419c882198da13d29d4b")
                .SetHost(client.RemoteIPHost.Host)
                .AsPost();


            using (var responseResult = await client.RequestAsync(request, 1000 * 10))
            {
                var response = responseResult.Response;
                StringBuilder sb = new StringBuilder();
                sb.Append(await response.GetBodyAsync());
                await Console.Out.WriteLineAsync(sb.ToString());
                MessageBox.Show(sb.ToString());
            }
        }
    }
}

